package GUILag;

import ControllerLag.EventCTR;
import ModelLag.Event;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * GUI - Panel til styring af CRUD event funktionaliteter.
 * @author DM75 Gruppe 3
 * @version 2011-12-22
 */
public class AdmEventPanel extends javax.swing.JPanel {
    
    private EventCTR eventCtr;

    /** Creates new form AdmEventPanel */
    public AdmEventPanel() {
        initComponents();
        
        eventCtr = new EventCTR();
        
        // Indsætter data i tabellen i GUI.
        updateEventTable();
    }
    
     /**
     * Henter den model som bruges i netbeans GUI, så man kan sætte properties ved
     * at højreklikke på tabellen i IDE. Man slipper derved for at skrive det i koden
     * eller at skulle lave sin egen tablemodel.
     * @return Tablemodel som bruges.
     */
    private DefaultTableModel getModel()
    {
        return (DefaultTableModel) eventTable.getModel();
    }
    
    

    /**
     * Bruges til at tilføje en række til modellen/tabellen. Derefter tilføjer den
     * det data som er med som parameter. Når der tilføjes noget til modellen, så
     * opdateres tabellen automatisk. 
     * @param eventName ArrangementNavn på event.
     * @param pricePrPerson PrisPrPerson på event.
     * @param pricePrPersonOnlyFood PrisPrPersonKunMad på event.
     * @param sort Bestemmer om modellen skal sorteres i 0. kolonne.
     */
    private void addRowAndData(String eventName, double  pricePrPerson, double pricePrPersonOnlyFood, boolean sort)
    {
        Object[] data = {eventName, pricePrPerson, pricePrPersonOnlyFood};
        getModel().addRow(data);
    
        if(sort)
        {
            sortTable();
        }
    }
    
    /**
     * Sortering af tabellen (den man ser) efter 0.kolonne. Sortere IKKE modellen.
     */
    private void sortTable()
    {
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(getModel());
        List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
        sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
        sorter.setSortKeys(sortKeys);
        eventTable.setRowSorter(sorter);
    }
    
    
    /**
     * Henter alle events og gemmer dem i en midlertidig ArrayList. I denne ArrayList
     * tages hvert element og så hentes der ArrangementNavn, PrisPrPerson og PrisPrPersonKunMad.
     * Derefter tilføjes disse til modellen og dermed til tabellen.
     */
    private void updateEventTable()
    {
        ArrayList<Event> events = eventCtr.getAllEvent();

        String eventName;
        double pricePrPerson;
        double pricePrPersonOnlyFood;
        
        
        
        for(Event eventObj : events)
        {   
            eventName = eventObj.getEventName();
            pricePrPerson = eventObj.getPricePrPerson();
            pricePrPersonOnlyFood = eventObj.getPricePrPersonOnlyFood();
            
            // Sortering foregår i databasen efter eventName, pricePrPerson og pricePrPersonOnlyFood. derfor false.
            addRowAndData(eventName, pricePrPerson, pricePrPersonOnlyFood, false);

        }
    } 
    
    /**
     * Sletter en række alt efter rækkenr i tabellen. Den konvertere først rækkenr
     * i tabellen til tilsvarende rækkenr i modellen da disse kan være forskellige
     * pga. at sorteringen foregår i tabellen og ikke i modellen. Derefter slettes
     * rækken i modellen og dermed i tabellen.
     * @param rowNo Rækkenr i tabellen som skal slettes. 
     */
    private void removeRow(int rowNo)
    {
        rowNo = eventTable.convertRowIndexToModel(rowNo);
        getModel().removeRow(rowNo);
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        createEventButton = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        eventTable = new javax.swing.JTable();
        deleteEventButton = new javax.swing.JButton();
        updateEventButton = new javax.swing.JButton();

        createEventButton.setText("Opret event");
        createEventButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createEventButtonActionPerformed(evt);
            }
        });

        eventTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Arrangement navn", "Pris pr person", "Pris pr person kun spisning"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.Double.class, java.lang.Double.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        eventTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        eventTable.getTableHeader().setReorderingAllowed(false);
        jScrollPane1.setViewportView(eventTable);

        deleteEventButton.setText("Slet event");
        deleteEventButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteEventButtonActionPerformed(evt);
            }
        });

        updateEventButton.setText("Opdater event");
        updateEventButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                updateEventButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(updateEventButton)
                        .addGap(18, 18, 18)
                        .addComponent(deleteEventButton))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(createEventButton)
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 452, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(154, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(createEventButton)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 341, Short.MAX_VALUE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(deleteEventButton)
                    .addComponent(updateEventButton))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    // event opdateres ved hjælp af den markerede række i tabellen hvor event navn bruges til opdatering.
    // rc = 1. Opdatering gik godt i databasen.
    // rc = -1. Opdatering mislykkedes.
    private void updateEventButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateEventButtonActionPerformed
        int rowSelected = eventTable.getSelectedRow();
        
        if(rowSelected == -1)
        {
            JOptionPane.showMessageDialog(this, "Vælg arrangement som skal opdateres.", "Vælg aarangement", JOptionPane.INFORMATION_MESSAGE);  
        }
        else
        {
            String eventName = (String) eventTable.getValueAt(rowSelected, 0);
            Double pricePrPerson = (Double) eventTable.getValueAt(rowSelected, 1);
            Double pricePrPersonOnlyFood = (Double) eventTable.getValueAt(rowSelected, 2);
            JTextField pricePrPersonField = new JTextField("" + pricePrPerson);
            JTextField pricePrPersonOnlyFoodField = new JTextField("" + pricePrPersonOnlyFood);

            Object[] message = new Object[] {"Arrangement navn: " + eventName, "Pris pr person:", pricePrPersonField, "Pris pr Person kun spisning", pricePrPersonOnlyFoodField};       
            Object[] options = { "Opdater", "Annuller"};
            
            //Bruges for at få fokus i det første textfield i JOptionpanet.
            int input = JOptionPane.showOptionDialog(this, message, "Opdatering af arrangement", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, "");

            if(input == JOptionPane.OK_OPTION)
            {
                try
                {
                    pricePrPerson = Double.parseDouble(pricePrPersonField.getText());
                    pricePrPersonOnlyFood = Double.parseDouble(pricePrPersonOnlyFoodField.getText()); 
                
                if(pricePrPersonField.getText().length() > 0)
                {
                    
                    int rc = -1;
                    try
                    {
                    rc = eventCtr.updateEvent(eventName, pricePrPerson, pricePrPersonOnlyFood);
                    }
                    catch(Exception e)
                    {
                        
                    }
                        if(rc == 1)
                        {
                            eventTable.setValueAt(eventName, rowSelected, 0);
                            eventTable.setValueAt(pricePrPerson, rowSelected, 1);
                            eventTable.setValueAt(pricePrPersonOnlyFood, rowSelected, 2);
                            JOptionPane.showMessageDialog(this, "Arrangement er nu opdateret.", "Opdatering lykkedes", JOptionPane.INFORMATION_MESSAGE);  
                        }
                        else
                        {
                            JOptionPane.showMessageDialog(this, "En fejl er opstået.", "Opdatering mislykkedes", JOptionPane.ERROR_MESSAGE);
                        }
                }
                }
                catch(Exception e)
                {
                    JOptionPane.showMessageDialog(this, "Der skal indtastes de rigtige data.", "Opdatering mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        
        
    }//GEN-LAST:event_updateEventButtonActionPerformed
    
    /**
     * Her oprettes et event ved hjælp af JOptionPane hvor der er 3 textfields,
     * hvor de forskellige data bliver indsat.
     * rc = 1. Oprettelsen gik godt i databasen.
     * rc -1. Fejl ved oprettelse i databasen. 
     */
    private void createEventButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createEventButtonActionPerformed
        JTextField eventNameField = new JTextField();
        JTextField pricePrPersonField = new JTextField();
        JTextField pricePrPersonOnlyFoodField = new JTextField();
        
        // Strings og JTexFields som skal vises i JOptionpane.
        Object[] message = new Object[] {"Arrangement navn:", eventNameField, "Pris pr. person:", pricePrPersonField, "Pris pr person kun spisning:", pricePrPersonOnlyFoodField};
        
        //En anden form for JOptionpane.
        //int input = JOptionPane.showConfirmDialog(this, message, "Opret ny arrangement", JOptionPane.OK_CANCEL_OPTION); HER er OK Knappen i fokus fra start!
        
        //Knapper på JOptionpane, som der har knapperne "OK" og "Annuller".        
        Object[] options = {"OK", "Annuller"};
        
        int input = JOptionPane.showOptionDialog(this, message, "Opret ny arrangement", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, "");
        
        if(input == JOptionPane.OK_OPTION)
        {
            if (eventNameField.getText().length() > 0)
            {
                try
                {
                    int rc = eventCtr.createEvent((eventNameField.getText()), Double.parseDouble(pricePrPersonField.getText()), Double.parseDouble(pricePrPersonOnlyFoodField.getText()));
                
                    //rc = return code
                    if(rc == 1)
                    {
                        addRowAndData((eventNameField.getText()), Double.parseDouble(pricePrPersonField.getText()), Double.parseDouble(pricePrPersonOnlyFoodField.getText()), true);
                        JOptionPane.showMessageDialog(this, "Arrangement "+ eventNameField.getText() + " er nu oprettet", "Oprettelse lykkedes", JOptionPane.INFORMATION_MESSAGE);
                    
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(this, "Der er opstået en fejl. arrangement" + eventNameField.getText() + " eksisterer muligvis i forvejen.", "oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
                    }
                
                }
                catch(NumberFormatException e)
                {
                    JOptionPane.showMessageDialog(this, "Der må kun indtastes tal i de to sidste felter", "oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
        
        }
        }
    }//GEN-LAST:event_createEventButtonActionPerformed

    // event slettes ved hjælp af den markerede række i tabellen hvor eventName bruges til sletning.
    // rc = 1. Sletning gik godt i databasen.
    // rc = -1. Sletning mislykkedes.
    private void deleteEventButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteEventButtonActionPerformed
        int rowSelected = eventTable.getSelectedRow();
        
        if(rowSelected != -1)
        {
            String eventName = (String) eventTable.getValueAt(rowSelected, 0);

            int input = JOptionPane.showConfirmDialog(this, "er du sikker på at du vil slette dette arrangement: " + eventName + "?", "Bekræft sletning", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
            if(input == JOptionPane.OK_OPTION)
            {
                int rc = eventCtr.deleteEvent(eventName);
                
                if(rc == 1)
                {
                    removeRow(rowSelected);
                    JOptionPane.showMessageDialog(this, "arrangementet er nu slettet", "sletning lykkedes", JOptionPane.INFORMATION_MESSAGE);
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "En fejl er opstået.", "Sletning mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        else
        {
            JOptionPane.showMessageDialog(this, "Vælg den kunde som skal slettes.", "Vælg et event", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_deleteEventButtonActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton createEventButton;
    private javax.swing.JButton deleteEventButton;
    private javax.swing.JTable eventTable;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton updateEventButton;
    // End of variables declaration//GEN-END:variables
}
